program lab4_2;

{$mode objfpc}{$H+}

uses
  math, // для sin, cos, max
  crt,  // для readkey
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

// функция - это та же процедура, только возвращающая значение (в данном случае типа real)
function f(u: real; t: real): real;
begin
  //write('f: max(', u:3:3, ', ', t:3:3, ')');
  if max(u, t) > 0
  then
      begin
           //writeln(' > 0 -> sin');
           f := u + sin( sqr(t) );
           // exit - это выход из процедуры. т.к. мы вычислили нужное значение f,
           // то мы возвращаем его из функции и не выполняем остальные инструкции.
           // поэтому в проверке условия
           // мы использовали только then, и нам не потребовался else
           exit;
      end;

  //writeln(' < 0 -> cos');
  f := cos( sqr(u) );
end;

var
  alpha, a, b, z: real;
  choice: char;
begin
  // здесь мы задаем так называемые значения по-умолчаню. если мы не будем вводить
  // значений с клавиатуры, то при вычислениях используются эти, уже заданные
  alpha := 0.18;
  a := -2.1;
  b := 1.25;

  writeln('lab4_2');
  writeln('press ''E'' if you want to enter alpha, a and b manually, any other key otherwise:');

  // readkey считывает один символ, не требуя нажатия enter после этого
  choice := readkey;
  // при проверке символов их следует приводить к одному регистру (в нашем случае, к нижнему)
  if ( lowercase(choice) = 'e')
  then
      begin
        writeln('enter alpha:');
        readln(alpha);
        writeln('enter a:');
        readln(a);
        writeln('enter b:');
        readln(b);
      end;

  writeln('alpha = ', alpha:3:3, '; a = ', a:3:3, '; b = ', b:3:3, ';');

  z := f( sin(alpha), a ) + f( cos(sqr(alpha)), sqr(b) ) + f( sin(sqr(alpha) - 1), a) + f( sqr(a - alpha), sqr(a + alpha) );
  writeln('z=', z:3:3);

  readln;
end.

